//创建用户相关的小仓库
import { defineStore } from 'pinia'
import { ref } from 'vue'

//引入接口
import { reqLogin, reqUserInfo } from '../../api/user'

//引入数据类型
import type { RouteRecordRaw } from 'vue-router'
//引入操作本地存储的工具方法
import { SET_TOKEN, REMOVE_TOKEN } from '../../utils/token'
//引入常量路由
import { constantRoutes } from '../../router/routes'

//创建用户小仓库
let useUserStore = defineStore('User', () => {
  //状态
  //用户登录成功后，服务器返回的token，存储到本地
  const token = ref<string>('')
  //路由,生成菜单需要的数组
  const menuRoutes = ref<RouteRecordRaw[]>([])
  menuRoutes.value = constantRoutes
  //用户姓名和头像
  const username = ref<string>('')
  const useravatar = ref<string>('')

  // 方法
  //用户登录的方法
  const userLogin = async (data: any) => {
    // console.log(data)
    //登录请求
    //成功200->token
    //失败201->msg
    let result: any = await reqLogin(data)
    console.log('登录请求', result)
    if (result.code == 200) {
      //pinia仓库存储一下token
      token.value = result.data as string
      //本地持久化存储token
      // localStorage.setItem('token',(result.data.token) as string)
      SET_TOKEN(result.data as string)
      //能保证当前async函数返回一个成功的promise
      return 'ok'
    } else {
      //返回一个失败的promise
      return Promise.reject(new Error(result.data.message))
    }
  }
  //获取用户信息方法
  const getUserInfo = async () => {
    //获取用户信息并存储到仓库中[头像、名字]
    let result = await reqUserInfo()
    //如果获取用户信息成功即返回200，则存储用户信息
    // console.log(result)
    if (result.code == 200) {
      username.value = result.data.username
      useravatar.value = result.data.avatar
      return 'ok'
    } else {
      return Promise.reject('获取用户信息失败')
    }
  }
  //退出登录的方法
  const userLogout = () => {
    //目前没有后端接口，所以不需要发请求
    //清除本地存储的token
    // localStorage.removeItem('token')
    REMOVE_TOKEN()
    token.value = ''
    username.value = ''
    useravatar.value = ''
    //清除菜单
    menuRoutes.value = constantRoutes
  }

  return {
    username,
    useravatar,
    token,
    menuRoutes,
    userLogin,
    getUserInfo,
    userLogout,
  }
})
//对外暴露获取小仓库的方法
export default useUserStore
